import java.util.ArrayList;
import java.util.List;

public class main {
    // 枚举出所有中缀表达式
    // a + c - b - d
    private static List<String> createOperationExpression(int[] cards){
        char[] signOperation = {'+','-','*','/'}; // 运算符号
        List<StringBuilder> noParenthesesOps = new ArrayList<>(); // 没有括号的运算表达式
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                for (int k = 0; k < 4; k++) {
                    for (int l = 0; l < 10; l++) {
                        noParenthesesOps.add(new StringBuilder().append('X').
                                append(signOperation[i]).append('X').
                                append(signOperation[j]).append('X').
                                append(signOperation[k]).append('X'));
                    }
                }
            }
        }
        List<StringBuilder> parenthesized = new ArrayList<>(); // 有括号的运算表达式
        for (int i = 0; i<noParenthesesOps.size(); i+=10) {
            StringBuilder sb = noParenthesesOps.get(i);
            if(sb.charAt(1) == sb.charAt(3)&&sb.charAt(1) == sb.charAt(5)&&(sb.charAt(1) == '+'||sb.charAt(1) == '*')){
                parenthesized.add(sb);
                continue;
            } // 同一级别的运算符不需要加括号
            parenthesized.add(noParenthesesOps.get(i).insert(0,'(').insert(4,')'));
            parenthesized.add(noParenthesesOps.get(i+1).insert(2,'(').insert(6,')'));
            parenthesized.add(noParenthesesOps.get(i+2).insert(4,'(').insert(8,')'));
            parenthesized.add(noParenthesesOps.get(i+3).insert(0,'(').insert(6,')'));
            parenthesized.add(noParenthesesOps.get(i+4).insert(2,'(').insert(8,')'));
            parenthesized.add(noParenthesesOps.get(i+5).insert(0,'(').insert(4,')').
                    insert(6,'(').insert(10,')'));
            parenthesized.add(noParenthesesOps.get(i+6).insert(0,'(').insert(3,'(').
                    insert(7,')').insert(8,')'));
            parenthesized.add(noParenthesesOps.get(i+7).insert(0,'(').insert(1,'(').
                    insert(5,')').insert(8,')'));
            parenthesized.add(noParenthesesOps.get(i+8).insert(2,'(').insert(5,'(').
                    insert(9,')').insert(10,')'));
            parenthesized.add(noParenthesesOps.get(i+9).insert(2,'(').insert(3,'(').
                    insert(7,')').insert(10,')'));
        }
        List<String> express = new ArrayList<>(); // 最后的表达式  1+2*3-4......
        for (StringBuilder sb : parenthesized) {
            int index = 0;
            for (int i = 0; i < sb.length(); i++) {
                if(sb.charAt(i) == 'X'){
                    sb.replace(i,i+1,Integer.toString(cards[index++]));
                }
            }
            express.add(sb.toString());
        }
        return express;
    }
    private static List<String> judePoint24(int[] cards){
        List<String> ans = new ArrayList<>();
        List<List<String>> exps = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                for (int k = 0; k < 4; k++) {
                    for (int l = 0; l < 4; l++) {
                        if(i!=j&&i!=k&&i!=l
                        &&j!=k&&j!=l
                        &&k!=l) {
                            List<String> list = createOperationExpression(new int[]{cards[i],cards[j],cards[k],cards[l]});
                            exps.add(list);
                        }
                    }
                }
            }
        }
        for (var list: exps) {
            for (String exp : list) {
                if(Utils.getExpresValue(exp) == 24.0) {
                    ans.add(reverseToCard(exp));
                }
            }
        }
        return ans;
    }
    // 转换成card A,J,K
    private static String reverseToCard(String s){
        //
        StringBuilder ans = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if('0'<=c&&c<='9'){
                StringBuilder sb = new StringBuilder();
                sb.append(c);
                int index = i + 1;
                while (index<s.length()) {
                    char c2 = s.charAt(index);
                    if('0' <= c2&& c2<='9') {
                        i = index;
                        sb.append(c2);
                        index++;
                    }else {
                        break;
                    }
                }
                switch (sb.toString()){
                    case "11" -> ans.append('J');
                    case "1" -> ans.append('A');
                    case "12" -> ans.append('Q');
                    case "13" -> ans.append('K');
                    default -> ans.append(sb);
                }
            }else {
                ans.append(c);
            }
        }
        return ans.toString();
    }
    public static void main(String[] args) {
        List<String> ans = judePoint24(new int[]{10,8,10,8});
        for (String s: ans) {
            System.out.println(s);
        }
        System.out.println("结束");
    }
}

